home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / dll / format.c < prev    next >
C/C++ Source or Header  |  2004-04-29  |  4KB  |  145 lines

  1. /*-------------------------------------------------------------
  2.   format.c : make a string to display in the clock
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcdll.h"
  10.  
  11. /* Globals */
  12.  
  13. void LoadFormatSetting(HWND hwnd);
  14. void MakeFormat(wchar_t* dst, const SYSTEMTIME* pt,
  15.     const wchar_t* fmt, int nMax);
  16.  
  17. /* Statics */
  18.  
  19. wchar_t m_format[BUFSIZE_FORMAT];
  20.  
  21. /*------------------------------------------------
  22.    format handler functions
  23. --------------------------------------------------*/
  24. typedef void (*HANDLERFUNC)(FORMATHANDLERSTRUCT* pstruc);
  25.  
  26. struct {
  27.     wchar_t ch;
  28.     wchar_t* prefix;
  29.     HANDLERFUNC func;
  30. } format_handers[] =
  31. {
  32.     { '/', NULL, SDateHandler },
  33.     { ':', NULL, STimeHandler },
  34.     { 'y', NULL, YearHandler },
  35.     { 'm', NULL, MonthHandler },
  36.     { 'd', NULL, DateHandler },
  37.     { 0, L"aaa", DayOfWeekHandler },
  38.     { 'h', NULL, HourHandler },
  39.     { 'n', NULL, MinuteHandler },
  40.     { 's', NULL, SecondHandler },
  41.     { 0, L"tt", AMPMHandler },
  42.     { 0, L"\\n", CRLFHandler },
  43.     { 0, L"\\x", CharaHandler },
  44.     { 'Y', NULL, AltYearHandler },
  45.     { 'g', NULL, EraHandler },
  46.     { 0, L"td", TimeDifHandler },
  47.     { 0, L"LDATE", LDATEHandler },
  48.     { 0, L"DATE", DATEHandler },
  49.     { 0, L"TIME", TIMEHandler },
  50.     { 0, L"SSS", MSecondHandler }, // only for testing
  51.     
  52.     { 0, L"USTR", UStrHandler },
  53.     // add your functions
  54. };
  55.  
  56. #define NUM_HANDLERS (sizeof(format_handers) / sizeof(format_handers[0])) 
  57.  
  58. /*------------------------------------------------
  59.    read settings and initialize
  60. --------------------------------------------------*/
  61. void LoadFormatSetting(HWND hwnd)
  62. {
  63.     wchar_t fmt_tmp[BUFSIZE_FORMAT-5];
  64.     
  65.     GetMyRegStrW(NULL, "Format", fmt_tmp, BUFSIZE_FORMAT-5, "");
  66.     if(fmt_tmp[0] == 0) g_bNoClock = TRUE;
  67.     
  68.     // add <% - %> to the clock format string
  69.     wcscpy(m_format, L"<%");
  70.     wcscat(m_format, fmt_tmp);
  71.     wcscat(m_format, L"%>");
  72.     
  73.     InitFormatTime();      // formattime.c
  74.     
  75.     // add your InitFormatXXX() here
  76. }
  77.  
  78. /*------------------------------------------------
  79.    make a string from date and time format
  80. --------------------------------------------------*/
  81. void MakeFormat(wchar_t* dst, const SYSTEMTIME* pt,
  82.     const wchar_t* pfmt, int nMax)
  83. {
  84.     SYSTEMTIME st;
  85.     FORMATHANDLERSTRUCT struc;
  86.     int i;
  87.     
  88.     if(pt == NULL) GetLocalTime(&st);
  89.     else memcpy(&st, pt, sizeof(SYSTEMTIME));
  90.     
  91.     if(pfmt == NULL) pfmt = m_format;
  92.     
  93.     struc.dp = dst;
  94.     struc.sp = pfmt;
  95.     struc.pt = &st;
  96.     
  97.     for(i = 0; i < nMax-1; i++) dst[i] = ' ';
  98.     dst[i] = 0;
  99.     
  100.     while(*struc.sp && *struc.dp)
  101.     {
  102.         if(*struc.sp == '<' && *(struc.sp + 1) == '%')
  103.         {
  104.             struc.sp += 2;
  105.             while(*struc.sp && *struc.dp)
  106.             {
  107.                 if(*struc.sp == '%' && *(struc.sp + 1) == '>')
  108.                 {
  109.                     struc.sp += 2;
  110.                     break;
  111.                 }
  112.                 if(*struc.sp == '\"')
  113.                 {
  114.                     struc.sp++;
  115.                     while(*struc.sp != '\"' && *struc.sp && *struc.dp)
  116.                         *struc.dp++ = *struc.sp++;
  117.                     if(*struc.sp == '\"') struc.sp++;
  118.                 }
  119.                 else
  120.                 {
  121.                     for(i = 0; i < NUM_HANDLERS; i++)
  122.                     {
  123.                         if(*struc.sp == format_handers[i].ch ||
  124.                             (format_handers[i].prefix &&
  125.                               wcsncmp(struc.sp, format_handers[i].prefix,
  126.                                  wcslen(format_handers[i].prefix)) == 0))
  127.                         {
  128.                             format_handers[i].func(&struc);
  129.                             break;
  130.                         }
  131.                     }
  132.                     if(i == NUM_HANDLERS)
  133.                         *struc.dp++ = *struc.sp++;
  134.                 }
  135.             }
  136.         }
  137.         else
  138.         {
  139.             *struc.dp++ = *struc.sp++;
  140.         }
  141.     }
  142.     *struc.dp = 0;
  143. }
  144.  
  145.